package org.roger.search.filter;

import java.io.IOException;

import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.index.DocsEnum;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Filter;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.FixedBitSet;

/**
 * 文件名过滤器
 * 用法：一般来说如果过滤所需要的信息都存在于索引中，就不需要自定义过滤器。
 *     不过在有些情况下，我们会处理一些外部的信息，就需要在搜索的时候定义自己的过滤器
 * @author luoweiyi
 */
public class FileNameFilter extends Filter implements LuceneSearchFilter{
	
	private FileNameAccessor fileNameAccessor;
	
	public FileNameFilter(FileNameAccessor fileNameAccessor){
		this.fileNameAccessor = fileNameAccessor;
	}

	@Override
	public Filter searchFilter() {
		return this;
	}

	@Override
	public DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs)
			throws IOException {
		//得到需要过滤的文件名
		String[] fileNames = fileNameAccessor.getFileName();
		final FixedBitSet bitSet = new FixedBitSet(context.reader().maxDoc());
		if(fileNames != null){
			for(String fileName : fileNames){
				DocsEnum docsEnum = context.reader().termDocsEnum(new Term("name",fileName));
				int docid = -1;
				while ((docid = docsEnum.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
			        bitSet.set(docid);
			    }
			}
		}
		return bitSet;
	}
}
